"""
工作流实例数据模型

工作流实例是工作流模板的运行时对象，每个实例独立执行。
实例创建时会快照模板的工作流定义，确保独立性。
"""
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, Boolean
from database import Base


class WorkflowInstance(Base):
    """工作流实例表"""
    __tablename__ = "workflow_instances"

    # 基础字段
    id = Column(Integer, primary_key=True, index=True, autoincrement=True)

    # 模板关联（新增）
    template_id = Column(Integer, ForeignKey("workflow_templates.id"), nullable=True, index=True)  # 关联的模板ID
    template_version = Column(Integer, nullable=True, default=1)  # 模板版本号（快照，非外键）
    template_name = Column(String(255), nullable=True)  # 模板名称（快照）

    # 工作流定义快照（新增）
    workflow_definition_snapshot = Column(Text, nullable=True)  # JSON 格式的工作流定义快照

    # 实例信息
    instance_name = Column(String(255), nullable=False, index=True)
    status = Column(String(50), nullable=False, index=True)  # 实例状态
    current_node_id = Column(String(100), nullable=True)  # 当前执行节点ID
    trigger_type = Column(String(50), nullable=False)  # manual/cron
    trigger_user = Column(String(100), nullable=True)  # 触发人
    input_params = Column(Text, nullable=True)  # JSON 格式的输入参数

    # 定时调度（从模板移至实例）
    cron_expression = Column(String(100), nullable=True)  # Cron 表达式
    cron_enabled = Column(Boolean, nullable=False, default=False)  # 是否启用定时调度

    # 增强调度功能（新增）
    schedule_type = Column(String(50), nullable=False, default='manual', index=True)  # 调度类型: create_only/manual/scheduled/dependent/cron
    schedule_config = Column(Text, nullable=True)  # JSON 格式的调度配置（依赖实例列表、定时时间等）

    # 执行信息
    created_at = Column(DateTime(timezone=True), nullable=False, default=lambda: datetime.now(ZoneInfo("Asia/Shanghai")))
    started_at = Column(DateTime(timezone=True), nullable=True)
    finished_at = Column(DateTime(timezone=True), nullable=True)
    duration = Column(Integer, nullable=True)  # 执行耗时(秒)
    error_message = Column(Text, nullable=True)
    created_by = Column(String(100), nullable=True)
    deleted_at = Column(DateTime(timezone=True), nullable=True)  # 软删除时间戳

    # 兼容字段（迁移期保留）
    workflow_id = Column(Integer, nullable=True)  # 废弃字段，保留以兼容旧数据

    def __repr__(self):
        return f"<WorkflowInstance(id={self.id}, name='{self.instance_name}', status='{self.status}', template_id={self.template_id})>"
